home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / et / et-2_2.lha / et2.2 / src / Slider.C < prev    next >
C/C++ Source or Header  |  1990-12-04  |  4KB  |  208 lines

  1. //$Slider,PagerCommand,Thumb,ThumbMover$
  2. #include "Slider.h"
  3.  
  4. //---- ThumbMover ------------------------------------------------------------
  5.  
  6. class ThumbMover: public Command {
  7.     Point thumborigin;
  8.     Slider *slider;
  9. public:
  10.     ThumbMover(Point, Slider*);
  11.     Command *TrackMouse(TrackPhase, Point, Point, Point);
  12.     void TrackFeedback(Point, Point, bool)
  13.     { /* indirect feedback */ }
  14. };
  15.  
  16. ThumbMover::ThumbMover(Point to, Slider *sl) : Command(cIdNone)
  17. {
  18.     slider= sl;
  19.     thumborigin= to;
  20. }
  21.  
  22. Command *ThumbMover::TrackMouse(TrackPhase atp, Point ap, Point, Point np)
  23. {
  24.     if (atp == eTrackRelease)
  25.     return gNoChanges;
  26.     if (atp == eTrackMove)
  27.     slider->MoveThumb(thumborigin + (np - ap));
  28.     return this;
  29. }
  30.  
  31. //---- Thumb -------------------------------------------------------------------
  32.  
  33. MetaImpl0(Thumb);
  34.  
  35. Thumb::Thumb(Slider *sl, GrCursor c) : VObject(Rectangle(20), eSliderThumb)
  36. {
  37.     slider= sl;
  38.     cursor= c;
  39. }
  40.  
  41. void Thumb::Draw(Rectangle r)
  42. {
  43.     GrPaintRect(r, ePatGrey50);
  44.     GrStrokeRect(contentRect);
  45. }
  46.  
  47. Metric Thumb::GetMinSize()
  48. {
  49.     return Metric(20);
  50. }
  51.  
  52. Command *Thumb::DoLeftButtonDownCommand(Point, Token, int)
  53. {
  54.     return new ThumbMover(GetOrigin(), slider);
  55. }
  56.  
  57. GrCursor Thumb::GetCursor(Point)
  58. {
  59.     return cursor;
  60. }
  61.  
  62. //---- Slider ------------------------------------------------------------------
  63.  
  64. MetaImpl(Slider, (T(minVal), T(maxVal), T(currVal), T(bubbleSize), 0));
  65.  
  66. Slider::Slider(int id, Direction dir)
  67.     : CompositeVObject(id, new Thumb(this, (dir == eVert) ? eCrsUpDownArrow
  68.                          : eCrsLeftRightArrow), 0)
  69. {
  70.     minVal= gPoint0;
  71.     maxVal= 100;
  72.     bubbleSize= GetThumb()->GetMinSize().extent;
  73. }
  74.  
  75. void Slider::SetVal(Point v, bool redraw)
  76. {
  77.     currVal= v;
  78.     Update(redraw);
  79. }
  80.  
  81. void Slider::SetMax(Point v, bool redraw)
  82. {
  83.     maxVal= v;
  84.     Update(redraw);
  85. }
  86.  
  87. void Slider::SetMin(Point v, bool redraw)
  88. {
  89.     minVal= v;
  90.     Update(redraw);
  91. }
  92.  
  93. void Slider::SetThumbRange(Point s, bool redraw)
  94. {
  95.     bubbleSize= s;
  96.     Update(redraw);
  97. }
  98.  
  99. void Slider::SetOrigin(Point at)
  100. {
  101.     Point d= GetThumb()->GetOrigin() - GetOrigin();
  102.     VObject::SetOrigin(at);
  103.     GetThumb()->SetOrigin(at+d);
  104. }
  105.  
  106. Metric Slider::GetMinSize()
  107. {
  108. //    return Max(GetExtent(), GetThumb()->GetMinSize().Extent());
  109.     return GetThumb()->GetMinSize();
  110. }
  111.  
  112. void Slider::Update(bool redraw)
  113. {
  114.     Rectangle b;
  115.     
  116.     b.extent= Range(GetThumb()->GetMinSize().extent, GetExtent(), Scale(bubbleSize, GetExtent(), maxVal));
  117.     b.origin= GetOrigin() + Scale(currVal, GetExtent()-b.extent, maxVal-bubbleSize);
  118.     if (GetThumb()->contentRect != b)
  119.     GetThumb()->SetContentRect(b, redraw);
  120. }
  121.  
  122. void Slider::MoveThumb(Point pos)
  123. {
  124.     Point val= Scale(pos-GetOrigin(), maxVal-bubbleSize,
  125.                     GetExtent()-GetThumb()->GetExtent());
  126.     Control(GetId(), eSliderThumb, &val);
  127. }
  128.  
  129. void Slider::Draw(Rectangle r)
  130. {
  131.     GrPaintRect(r, ePatGrey12);
  132.     CompositeVObject::Draw(r);
  133.     GrSetPenNormal();
  134.     GrStrokeRect(contentRect);
  135. }
  136.  
  137. int Slider::Where(Point lp)
  138. {
  139.     Rectangle r= GetThumb()->contentRect;
  140.     
  141.     if (lp.x >= r.NW().x && lp.x <= r.NE().x) {
  142.     if (lp.y < r.origin.y)
  143.         return 1;
  144.     return 2;
  145.     }
  146.     if (lp.y >= r.NW().y && lp.y <= r.SW().y) {
  147.     if (lp.x < r.origin.x)
  148.         return 3;
  149.     return 4;
  150.     }
  151.     return 0;
  152. }
  153.  
  154. Command *Slider::DoLeftButtonDownCommand(Point lp, Token, int)
  155. {
  156.     switch (Where(lp)) {
  157.     case 1:
  158.     case 3:
  159.     return new PagerCommand(this, eSliderPageUpLeft);
  160.     case 2:
  161.     case 4:
  162.     return new PagerCommand(this, eSliderPageDownRight);
  163.     }
  164.     return gNoChanges;
  165. }
  166.  
  167. GrCursor Slider::GetCursor(Point lp)
  168. {
  169.     switch (Where(lp)) {
  170.     case 1:
  171.     return eCrsUpArrow;
  172.     case 2:
  173.     return eCrsDownArrow;
  174.     case 3:
  175.     return eCrsLeftArrow;
  176.     case 4:
  177.     return eCrsRightArrow;
  178.     }
  179.     return VObject::GetCursor(lp);
  180. }
  181.  
  182. //---- PagerCommand ------------------------------------------------------------
  183.  
  184. PagerCommand::PagerCommand(Slider* s, int p)   
  185.             : Command(0, (CommandFlags)(eCmdDefault | eCmdIdleEvents))
  186. {
  187.     slider= s;
  188.     part= p;
  189. }
  190.  
  191. void PagerCommand::TrackFeedback(Point, Point, bool)
  192. {
  193. }
  194.  
  195. Command *PagerCommand::TrackMouse(TrackPhase atp, Point, Point, Point np)
  196. {
  197.     switch (atp) {
  198.     case eTrackPress:
  199.     case eTrackIdle:
  200.     if (slider->ContainsPoint(np))
  201.         slider->Control(slider->GetId(), part, (void*)0);
  202.     break;
  203.     case eTrackRelease:
  204.     return gNoChanges;
  205.     }
  206.     return this;
  207. }
  208.